/* Proxy / Reflect静态类*/

// let proson = {
//   name: 'glh',
//   age: 18,
// };

// const proxy = new Proxy(proson, {
//   get(target, property) {
//     console.log(target, property);
//     return 100;
//   },
//   set(target, property, value) {
//     console.log(value);
//     target[property] = value;
//   },
//   // ...  // 未定义的则以Reflect的静态类方法默认实现
// });
// console.log(proxy.name);
// proxy.sex = true;
// console.log(proxy);
//  Proxy or Object.defineProperty()
// console.log('---------')

// - defineProperty只能监视属性的读写 Proxy可以监视更多对象操作

// let proson = {
//   name: 'glh',
//   age: 18,
// };

// const proxy = new Proxy(proson, {
//   get(target, property) {
//     console.log(target, property);
//     return 100;
//   },
//   deleteProperty(target, property) {
//     console.log(property);
//     delete target[property];
//   },
//   set(target, property, value) {
//     console.log(value);
//     target[property] = value;
//   },
// });
// delete proxy.name;
// console.log(proson);
// - get(target, propKey, receiver)：拦截对象属性的读取，比如proxy.foo和proxy['foo']。

// - set(target, propKey, value, receiver)：拦截对象属性的设置，比如proxy.foo = v或proxy['foo'] = v，返回一个布尔值。
// -  has(target, propKey)：拦截propKey in proxy的操作，返回一个布尔值。

// -  deleteProperty(target, propKey)：拦截delete proxy[propKey]的操作，返回一个布尔值。

// -  ownKeys(target)：拦截Object.getOwnPropertyNames(proxy)、Object.getOwnPropertySymbols(proxy)、Object.keys(proxy)、for...in循环，返回一个数组。该方法返回目标对象所有自身的属性的属性名，而Object.keys()的返回结果仅包括目标对象自身的可遍历属性。

// -  getOwnPropertyDescriptor(target, propKey)：拦截Object.getOwnPropertyDescriptor(proxy, propKey)，返回属性的描述对象。

// -  defineProperty(target, propKey, propDesc)：拦截Object.defineProperty(proxy, propKey, propDesc）、Object.

// -  defineProperties(proxy, propDescs)，返回一个布尔值。

// -  preventExtensions(target)：拦截Object.preventExtensions(proxy)，返回一个布尔值。

// -  getPrototypeOf(target)：拦截Object.getPrototypeOf(proxy)，返回一个对象。

// -  isExtensible(target)：拦截Object.isExtensible(proxy)，返回一个布尔值。

// -  setPrototypeOf(target, proto)：拦截Object.setPrototypeOf(proxy, proto)，返回一个布尔值。如果目标对象是函数，那么还有两种额外操作可以拦截。

// -  apply(target, object, args)：拦截 Proxy 实例作为函数调用的操作，比如proxy(...args)、proxy.call(object, ...args)、proxy.apply(...)。

// -  construct(target, args)：拦截 Proxy 实例作为构造函数调用的操作，比如new proxy(...args)。
// console.log('---------')

// - 直接监视数组，不用自定义方法覆盖原生方法

// let arr = [1];

// const listProxy = new Proxy(arr, {
//   get(target, property) {
//     console.log(target, property);
//     return 100;
//   },
//   set(target, property, value) {
//     console.log(value);
//     target[property] = value;
//   },
// });
// console.log(listProxy[0]);
// listProxy[1] = 2;
// console.log(arr);

// -Proxy是以非侵入性的方式对对象属性进行监视
// console.log('----------');

// Reflect;
// Reflect内部分装了一系列对象的底层操作;
// Reflect的成员方法就是Proxy处理对象的默认实现

// let proson = {
//   name: 'glh',
//   age: 18,
// };

// const proxy = new Proxy(proson, {
//   get(target, property) {
//     return Reflect.get(target, property);
//   },
//   deleteProperty(target, property) {
//     return Reflect.deleteProperty(target, property);
//   },
//   set(target, property, value) {
//     console.log(value);
//     target[property] = value;
//   },
// });
// proxy.name;
// delete proxy.age;
// console.log(proson);

// 为什么会有Reflect对象;
// 因为Reflect对象提供了统一的操作API;

let proson = {
  name: 'glh',
  age: 18,
};

// console.log('name' in proson);
// console.log(delete proson['age']);
// console.log(Object.keys(proson));
// console.log(Reflect.has(proson, 'name'));
// console.log(Reflect.deleteProperty(proson, 'name'));
// console.log(Reflect.ownKeys(proson, 'name'));

// class Person {
//   constructor() {
//     this.sex = true;
//   }
//   static say() {
//     console.log('say');
//   }
//   age = 'glh';
//   static create() {
//     // this.say();
//     return new Person();
//   }
// }
// console.log(Person.create());
// let obj = { a: 1, b: 2 };
// console.log(Object.entries(obj));

// const obj = {
//   [Symbol.for('fpp')]: 'glh',
// };
// console.log(obj);
// const symbol = Object.getOwnPropertySymbols(obj)[0];
// console.log(symbol);
// console.log(obj[symbol]);
// console.log(obj[Symbol.for('fpp')]);

let name = 'a';
const obj = {
  [name]: 'glh',
};
console.log(obj); //{a: "glh"}
